
package beans;

import bc.Apoderado;
import be.ApoderadoFacadeLocal;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB; 
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.inject.Named;

/**
 *
 * @author DEAPP
 */
@Named("managedBeanApoderado")
@SessionScoped
public class ManagedBeanApoderado implements Serializable{
    @EJB
    private ApoderadoFacadeLocal apoderadoFacade;
    private Apoderado objeto;
    private Apoderado objetoCrear;
    private List<Apoderado> lista;
    private List<Apoderado> listaFiltrada;
    private List<SelectItem> ListaItems = new LinkedList<SelectItem>();
    private HashMap<Integer, Apoderado> myMapItems = new HashMap<Integer, Apoderado>();

    private String CadenaBusqueda="";
    
    public ManagedBeanApoderado() {
    }

    public String getCadenaBusqueda() {
        return CadenaBusqueda;
    }

    public void setCadenaBusqueda(String CadenaBusqueda) {
        this.CadenaBusqueda = CadenaBusqueda;
    }

    
    public ApoderadoFacadeLocal getApoderadoFacade() {
        return apoderadoFacade;
    }

    public void setApoderadoFacade(ApoderadoFacadeLocal apoderadoFacade) {
        this.apoderadoFacade = apoderadoFacade;
    }

    public Apoderado getObjeto() {
        return objeto;
    }

    public void setObjeto(Apoderado objeto) {
        this.objeto = objeto;
    }

    public Apoderado getObjetoCrear() {
        return objetoCrear;
    }

    public void setObjetoCrear(Apoderado objetoCrear) {
        this.objetoCrear = objetoCrear;
    }

    public List<Apoderado> getLista() {
      try {
            lista = new ArrayList<Apoderado>();
            for(Apoderado ap :apoderadoFacade.findAll())
            {
            if(ap.getEstadoExistencia()==1){
            lista.add(ap);
            }
            }     
            
        } catch (Exception e) {
        }
              return lista;
    }

    public void setLista(List<Apoderado> lista) {
        this.lista = lista;
    }

    public List<Apoderado> getListaFiltrada() {
        return listaFiltrada;
    }

    public void setListaFiltrada(List<Apoderado> listaFiltrada) {
        this.listaFiltrada = listaFiltrada;
    }

    public List<SelectItem> getListaItems() {
        myMapItems = new HashMap<Integer, Apoderado>();
            ListaItems = new LinkedList<SelectItem>();
            for (Apoderado p : apoderadoFacade.findAll()) {
                myMapItems.put(p.getIdApoderado(), p);
                ListaItems.add(new SelectItem(p, p.getNombre()+""+p.getApepat()+""+p.getApemat()));
            }
        return ListaItems;
    }

    public void setListaItems(List<SelectItem> ListaItems) {
        this.ListaItems = ListaItems;
    }

    public HashMap<Integer, Apoderado> getMyMapItems() {
        return myMapItems;
    }

    public void setMyMapItems(HashMap<Integer, Apoderado> myMapItems) {
        this.myMapItems = myMapItems;
    }
    public void llenar_myItems() {
            try {
                myMapItems = new HashMap<Integer, Apoderado>();
                ListaItems = new LinkedList<SelectItem>();
                for (Apoderado p : apoderadoFacade.findAll()) {
                    myMapItems.put(p.getIdApoderado(), p);
                    ListaItems.add(new SelectItem(p, p.getNombre()+""+p.getApepat()+""+p.getApemat()));

                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
      public Apoderado getObjeto(int id){
       return myMapItems.get(id);
      }
      
      public void editar() {
        try {
            
            apoderadoFacade.edit(objeto);
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Actualizado Correctamente", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);

        } catch (Exception e) {
            FacesMessage msg = new FacesMessage("Error", "Conctate con el Administrador");
            FacesContext.getCurrentInstance().addMessage(null, msg);

        }
    }
      
      public void editarEliminar() {
        try {
            // estado 2 son eliminados
            objeto.setEstadoExistencia(2);
            apoderadoFacade.edit(objeto);
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Eliminado Correctamente", "_");
            FacesContext.getCurrentInstance().addMessage(null, msg);

        } catch (Exception e) {
            FacesMessage msg = new FacesMessage("Error", "Conctate con el Administrador");
            FacesContext.getCurrentInstance().addMessage(null, msg);

        }
    }
      
      
      public void crear() {
        try {
            objetoCrear.setEstadoExistencia(1);
            
            // este objeto deberia estar seteado a un calendar ahi en la pagina
            // aun no esta
            objetoCrear.setFechaNacimiento(new Date());
            apoderadoFacade.create(objetoCrear);
            FacesMessage msg = new FacesMessage("Creado Correctamente", "_");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            objetoCrear = new Apoderado();
        } catch (Exception e) {
            FacesMessage msg = new FacesMessage("Error", "Conctate con el Administrador");
            FacesContext.getCurrentInstance().addMessage(null, msg);

        }
    }
      
    public void nueva() {
        try {
            
            apoderadoFacade.create(objeto);
            FacesMessage msg = new FacesMessage("Se registro Correctamente", "_");
            FacesContext.getCurrentInstance().addMessage(null, msg);

        } catch (Exception e) {
            FacesMessage msg = new FacesMessage("Error", "Conctate con el Administrador");
            FacesContext.getCurrentInstance().addMessage(null, msg);

        }
    }
    // METODO DE FILTRO
    public void filtradaCadena(String cadena){
        System.out.println(" entramos a filtrar a:"+cadena);
    // vamos a usar la cadena, como esta seteada cuando le damos en el boton
    // automaticamente ya queda en el managed Bean y lo usamos asi:    
    List<Apoderado> listaTemporal = new LinkedList<Apoderado>();
    // Traemos toda la lista de la BD , reciente.
    lista = apoderadoFacade.findAll();
   // Recorremos la Lista
    for(Apoderado a :lista)
    {
    // aqui preguntamos y validamos para que pase el filtro
    if(/* esta validacion es que cada elemento este activo*/ a.getEstadoExistencia()==1 && /*ahora validamos por nombre o DNI */ (a.getDni().toUpperCase().indexOf(cadena.trim().toUpperCase()) != -1  || a.getApepat().toUpperCase().indexOf(cadena.trim().toUpperCase()) != -1  ||a.getNombre().toUpperCase().indexOf(cadena.trim().toUpperCase()) != -1 ))    
    {
    // aqui solo entran los que queremos
        System.out.println(" se encontro en :"+a.getNombre()+a.getApepat());
     listaTemporal.add(a);
    }
        
        }
    
    // alfinal la lista que necesitamos solo debe quedar reducida a la filtrada asi:
        lista=listaTemporal;
         // Solo si no hay elementos entonces manda llamarlos
            if(lista.isEmpty()){
            lista = apoderadoFacade.findAll();
                System.out.println(" NO HAY COINCIDENCIAS");
            FacesMessage msg = new FacesMessage("NO SE ENCONTRARON COINCIDENCIAS", "_");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        // al darle Update deberia actualizar
    }
    
    public void processValueChange(ValueChangeEvent e){
 System.out.println("valueChangeListener invoked:" 
                      + " OLD: " + e.getOldValue() 
                      + " NEW: " + e.getNewValue());
 this.filtradaCadena(e.getNewValue().toString());
 }
    public void nuevoObjeto(){
        // creando una nueva instancia de objeto
    objetoCrear = new Apoderado();
    }
    
    public String paginaApoderados(){
    return "apoderado1.jsf";
    }
}
